/******************************************************************************* Main Source File Company: Microchip Technology Inc. File Name: main.c Summary: This file contains the "main" function for a project. Description: This file contains the "main" function for a project. The "main" function calls the "SYS_Initialize" function to initialize the state machines of all modules in the system *******************************************************************************/ // ***************************************************************************** // ***************************************************************************** // Section: Included Files // ***************************************************************************** // ***************************************************************************** #include <stddef.h> // Defines NULL #include <stdbool.h> // Defines true #include <stdlib.h> // Defines EXIT_FAILURE #include "definitions.h" // SYS function prototypes #include <stdio.h> #include "1lcd_lib_XC32.h" struct tm initialTime; //年月日時分秒の構造体を宣言 struct tm alarm_time; //アラーム時刻の 年月日時分秒の構造体を宣言 int delay_Clock = 200000000; //200MHz char Buf[32]; bool LED; int SecStatus1; int SecFlag; int Year, Month, Day, WeekDay, Hour, Minute, Second; int AlarmOccurrence; //アラーム発生フラグ int Hour0,Minute0,Second0; char Week[7][4] = {{"Sun"},{"Mon"},{"Tue"},{"Wed"},{"Thu"},{"Fri"},{"Sat"}}; // Week[7][3]では、文字列終端の\0が含まれない void delay_us(volatile unsigned int usec) //1μsec遅延 { volatile int count; count = (int)(delay_Clock/20000000)*usec; do //実測 at 200MH (Clock=200000000) { //delay_us(1000):1000.4μsec delay_us(100):100.6μsec delay_us(10):10.5μsec  delay_us(1):1.5μsec asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); count--; }while(count != 0); } void delay_ms(volatile unsigned int msec) //1msec遅延 { volatile unsigned int i; //実測:at200MH (Clock=200000000)//delay_ms(1): 1.0006msec delay_ms(100):100.04msec for(i=0; i<msec; i++) delay_us(1000); } void RTCC_Callback( uintptr_t context) //アラーム発生コールバック関数 { AlarmOccurrence = 1; //アラーム発生のフラグをたてる RTCC_TimeGet(&initialTime); Hour0 = initialTime.tm_hour; //時 Minute0 = initialTime.tm_min; //分 Second0 = initialTime.tm_sec; //秒 } void Display_DateTime(void) //年月日と時刻の液晶表示 { lcd_cmd(0x80); //1目の先頭へ sprintf(Buf,"Alarm occurred ");// lcd_str(Buf); //液晶表示 lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf," at %02d:%02d:%02d ",Hour0,Minute0,Second0); // lcd_str(Buf); // 開始メッセージ1行目表示 } void APP_Initialize ( void ) { lcd_init(); // LCD初期化 lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); delay_ms(1000); lcd_cmd(0x80); //1目の先頭へ sprintf(Buf,"RTCC Demo ");// lcd_str(Buf); //液晶表示 delay_ms(1000); lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf," Start !! "); // lcd_str(Buf); // 開始メッセージ1行目表示 delay_ms(1000); // Time setting 2017年2月28日23時59分45秒 火曜日 initialTime.tm_year = 17; initialTime.tm_mon = 2; initialTime.tm_mday = 28; initialTime.tm_wday = 2; initialTime.tm_hour = 23; initialTime.tm_min = 59; initialTime.tm_sec = 45; RTCC_TimeSet(&initialTime);//年月日時分秒設定 // Alarm setting 2017年3月1日0時0分15秒 水曜日 alarm_time.tm_year = 17; alarm_time.tm_mon = 3; alarm_time.tm_mday = 1; alarm_time.tm_wday = 3; alarm_time.tm_hour = 0; alarm_time.tm_min = 0; alarm_time.tm_sec = 15; RTCC_AlarmSet(&alarm_time, RTCC_ALARM_MASK_HHMISS); //RTCC_ALARM_MASK_HHMISS: Once a day } // ***************************************************************************** // ***************************************************************************** // Section: Main Entry Point // ***************************************************************************** // ***************************************************************************** int main ( void ) { /* Initialize all modules */ SYS_Initialize ( NULL ); APP_Initialize (); RTCC_CallbackRegister(RTCC_Callback, (uintptr_t) NULL); while ( true ) { /* Maintain state machines of all polled MPLAB Harmony modules. */ SYS_Tasks ( ); SecStatus1 = RTCCONbits.HALFSEC; //Half Second bitの状態取得 if(SecStatus1 != SecFlag) { SecFlag = SecStatus1; //ビット反転 if(LED == 1) { LED = 0; LATGbits.LATG15 = 1; //LED点灯 RTCC_TimeGet(&initialTime); } else { LED = 1; LATGbits.LATG15 = 0; //LED消灯 } Year = initialTime.tm_year; //西暦年 Month = initialTime.tm_mon; //月 Day = initialTime.tm_mday; //日 WeekDay = initialTime.tm_wday; //曜日 Hour = initialTime.tm_hour; //時 Minute = initialTime.tm_min; //分 Second = initialTime.tm_sec; //秒 if(AlarmOccurrence != 1 ) //アラーム発生の割り込みが発生していない場合 { lcd_cmd(0x80); //1目の先頭へ sprintf(Buf,"%d/%02d/%02d %s ",Year,Month,Day,Week[WeekDay]);// lcd_str(Buf); //液晶表示 lcd_cmd(0xC0); //2行目の先頭へ sprintf(Buf,"%02d:%02d:%02d ",Hour,Minute,Second); // lcd_str(Buf); // 開始メッセージ1行目表示 } else { RTCCONbits.RTCOE = 0; //RTCC(RD0)ピンへのRTCCクロック(1Hz,duty=50%))の停止 //RTCC output is disabled TRISDbits.TRISD0 = 0; LATDbits.LATD0 = 0; Display_DateTime(); //年月日と時刻の液晶表示 } } } /* Execution should not come here during normal operation */ return ( EXIT_FAILURE ); } /******************************************************************************* End of File */